package cn.oms.file.provider.service.impl;

import cn.oms.file.api.dto.req.ExcelWriteReq;
import cn.oms.file.api.service.IExcelService;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.RestController;

import java.io.FileOutputStream;
import java.io.IOException;

@RestController
@Service
@Slf4j
public class ExcelServiceImpl implements IExcelService {

    @Value("${oms.file.excel.upload.path}")
    private String fileUploadPath;

    @Value("${oms.file.resource.excel.host}")
    private String excelFileHost;

    /**
     * Excel表格生成
     *
     * 采用SXSSFWorkbook生成Excel表格
     * SXSSFWorkbook写入100000条数据
     * 使用时间为 = 1.904s
     *
     * @param excelWriteReq
     * @return
     */
    @Override
    public String WriteExcel(ExcelWriteReq excelWriteReq) {

        // 获取文件格式
        String format = excelWriteReq.getExcelFileFormat();
        // 获取文件名 拼接文件名+文件格式
        // 文件名.文件格式
        String fileName = excelWriteReq.getExcelFileName() + "." + format;
        String PATH = fileUploadPath + fileName;
        // 获取当前开始时间
        long begin = System.currentTimeMillis();
        // 新增工作簿
        Workbook workbook = new SXSSFWorkbook();
        // 创建工作表
        Sheet sheet = workbook.createSheet();
        // 获取 需要保存的Excel的内容数据矩阵
        String[][] excelContent = excelWriteReq.getExcelContent();
        // 将内容存入创建的Excel表中
        int i=0;
        for (String[] rowValue : excelContent){
            int j=0;
            // 工作表中创建一行
            Row row = sheet.createRow(i++);
            for(String cellValue : rowValue){
                // 每一行中定位一个单元格
                Cell cell = row.createCell(j++);
                cell.setCellValue(cellValue);
            }
        }
        log.info("{}文件创建生成成功,正在通过输出流写入文件,文件路径为：{}",fileName,PATH);
        // 新建文件输出流
        try {
            //文件路径可能会找不到，所以需要捕获异常
            FileOutputStream fileOutputStream = new FileOutputStream(PATH);
            workbook.write(fileOutputStream);
            fileOutputStream.close();
        } catch (IOException e) {
            log.info("{}异常,文件流写入异常,文件路径{}",fileName,PATH);
            e.printStackTrace();
        } finally {
            // 使用SXSSFWorkbook时会产生临时文件，一般是存入100条数据，也可以自行调整
            // 关闭临时文件 清除临时文件
            ((SXSSFWorkbook) workbook).dispose();
        }
        // 获取结束时间
        long end = System.currentTimeMillis();
        // 计算文件写入消耗时间
        log.info("Excel文件{}写入成功,所用时间为：{}",fileName,(double)(end-begin)/1000 + "s");

        String fileHost = excelFileHost+fileName;

        log.info("{}文件前端访问路径为：{}",fileName,fileHost);
        return fileHost;
    }
}
